/**
 * 头文件：
 * 介绍
 * 作者
 * 时间
 **/
#ifdef CM_ATOL_E10E_SUPPORT

#include "cm_main.h"

#include "atol_all_head.h"

// #include "atol_user_task.h"


/*----------------------------------------------------------------------------------------------------
# 函数功能 数据定义
# 参数介绍
----------------------------------------------------------------------------------------------------*/
osThreadId Atol_Uart0_TaskHandle;


/*----------------------------------------------------------------------------------------------------
# 函数功能 消息队列的数据定义
# 参数介绍
----------------------------------------------------------------------------------------------------*/
// 发送消息队列
message_uart0_send = {512,4,NULL,NULL};
// osMessageQId g_message_uart0_send_id;

// 接收消息队列
message_uart0_receive = {512,4,NULL,NULL};
// osMessageQId g_message_uart0_receive_id;


/*----------------------------------------------------------------------------------------------------
# 函数功能 uart0接收到数据的任务，接收到数据就存入到queue中。该任务就一直循环读取queue，有数据就发送
# 参数介绍 
----------------------------------------------------------------------------------------------------*/
void atol_firmware_task_uart(void) {
	
	while(true) {
		
		unsigned int num;
		num = osMessageWaiting(g_message_uart0_receive_id);
		cm_printf("cm_uart_demo, atol_firmware_task_uart0, queue num is %d \r\n", num);
		
        if(num == 0) {  
			return;
			
        } else {
			// 该queue中存在消息，读取一条数据
			osEvent message_uart0_receive_event;
			message_uart0_receive_event = osMessageGet(g_message_uart0_receive_id, 200);
			// 打印数据和指针
			cm_printf("cm_uart_demo, atol_firmware_task_uart0, queue data point is %d \r\n", 
				message_uart0_receive_event.value.v);
			
			// 拷贝数据
			unsigned char buf[512];
			memcpy(message_uart0_receive_event.value.v,buf,512*sizeof(unsigned char));
			cm_printf("cm_uart_demo, atol_firmware_task_uart0, queue array is %s \r\n", buf);
			
		}
		
		// 增加阻塞时间
        osDelay(50);   
    }
	
}


/*----------------------------------------------------------------------------------------------------
# 函数功能 外设的初始化
# 参数介绍
----------------------------------------------------------------------------------------------------*/
void atol_peripheral_init(void) {
	
	// 1. 串口0的初始化
	// cm_test_uart_init();
	atol_firmware_uart0_init();
	cm_printf("atol_thread_peripheral_init- program start \r\n");
	
	// 发送数据
	char sendArray[3] = {'a','b','c'};
	cm_uart_send_cache(CM_UART_0,&sendArray,3);
	
	
	// 2. UART1是debug串口，是无法配置和使用



	// 3. UART2是GNSS的串口，在有GNSS的情况下也是无法使用



    //3. 指示灯引脚初始化



    //4. FS的文件初始化

}


/*----------------------------------------------------------------------------------------------------
# 函数功能 消息队列的初始化
# 参数介绍
----------------------------------------------------------------------------------------------------*/
void alto_queue_init(void) {

	// 1. uart0发送的消息队列，在第二个参数OC_Main_TaskHandle，我没明白是什么意思
	g_message_uart0_send_id = osMessageCreate(&message_uart0_send,NULL);
	
	// 2. uart0的接收消息队列
	g_message_uart0_receive_id = osMessageCreate(&message_uart0_receive,NULL);
	
}


/*----------------------------------------------------------------------------------------------------
# 函数功能 任务线程的初始化
# 参数介绍
----------------------------------------------------------------------------------------------------*/
void alto_thread_init(void) {
	
	// 1. 定时器建立，0.5s的定时器
	// atol_kernle_timer_init();
	
	// 定时器测试
	// cm_test_os_timer();
	
	
	// 2. 建立转发任务
	osThreadDef(Atol_Task_Uart0_Receive, atol_firmware_task_uart, osPriorityNormal, 0, 2048);
    Atol_Uart0_TaskHandle = osThreadCreate(osThread(Atol_Task_Uart0_Receive), 0);
    
    // cmd_mutex = osMutexCreate( osMutex(cmdMutex) );

}


/*----------------------------------------------------------------------------------------------------
# 函数功能 初始化
# 参数介绍
----------------------------------------------------------------------------------------------------*/
void atol_main_init(void) {

	// 1. 创建硬件的外设，有可能是应该先初始化queue和线程。
	atol_peripheral_init();
	
	// 2. 读取fs文件获取初始化内容
	// atol_firmware_fs_init();
	
	// 3. 创建消息队列
	alto_queue_init();


	// 4. 创建任务


    osDelay(20);
}







#endif